Ruby 日記 3日目: Enumerator::Lazyから値を取り出す
次のプログラムはEnumerator::Lazyを使っています。
先頭から5つの値を取り出すにはどのメソッドが必要ですか
code:rb
(1..100).each.lazy.chunk(&:even?)
選択肢:
take(5)
take(5).force
first(5)
first(5).force
解説:
意識してつかったことはないな〜
Rails内部で使われていたりしそうだなぁ(なんとなく
Lazyから値を取り出すには、Enumerator::Lazy#force または Enumerable#first を呼びます。
なるほど〜
code:gold/ex03/main.rb
x = (1..100).each.lazy.chunk(&:even?)
p x.take(5)
p x.take(5).force
p x.first(5)
p x.first(5).force
code:sh
$ ruby gold/ex03/main.rb
false, [1, [true, 2], [false, 3], [true, 4], [false, 5]] false, [1, [true, 2], [false, 3], [true, 4], [false, 5]] take(5) は Enumerator::Lazy を返す
take(5).force は値5つが入ったArrayを返す。正解。
first(5) は値5つが入ったArrayを返す。正解。
first(5).force は NoMethodError になる。Array に force メソッドは存在しないからね〜
なので正解は take(5).force と first(5) の2つ。
/icons/hr.icon
ちなみに chunk メソッドつかったことなかったけど、結構便利っぽいな〜。
Enumerable#chunk と同じですが、配列ではなく Enumerator::Lazy を返します。
要素を前から順にブロックで評価し、その結果によって 要素をチャンクに分けた(グループ化した)要素を持つ Enumerator を返します。
ブロックの評価値が同じ値が続くものを一つのチャンクとして 取り扱います。すなわち、ブロックの評価値が一つ前と 異なる所でチャンクが区切られます。
なるほどな〜、たとえば
code:gold/ex03/chunk.rb
p 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5.chunk(&:even?).to_a code:sh
$ ruby gold/ex03/chunk.rb
false, [3, 1, [true, 4], [false, 1, 5, 9], [true, 2, 6], [false, 5, 3, 5]] なんかわからんけど、競プロでつかえそう。